﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Data;

namespace LoghogInterface.Modules
{
    /// <summary>
    /// Класс для работы с базой данных журнала
    /// </summary>
    class JournalSQLHelper
    {
        /// <summary>
        /// Схема базы данных
        /// </summary>
        private DBSchemeDataContextDataContext _database;

        public JournalSQLHelper()
        {
            _database = new DBSchemeDataContextDataContext(SQLQueries.ConnectionString());
            _database.Connection.Open();
        }

        /// <summary>
        /// Получить поля журнала по id журнала
        /// </summary>
        /// <param name="idJournal">ID журнала</param>
        /// <returns>Возвращает коллекцию полей журнала</returns>
        public IQueryable<Field> GetFieldsJournal(int idJournal)
        {
            return (from i in _database.Journal_Field where i.JournalID == idJournal select i.Field);
        }

        /// <summary>
        /// Получить значения полей журнала
        /// </summary>
        /// <param name="fields">Коллекция с полями журнала</param>
        /// <returns>Возвращает коллекцию строк журнала, сгруппированных по дате</returns>
        public IQueryable<IGrouping<System.DateTime?, string>> GetFieldValues(IQueryable<Field> fields)
        {
            var values = (from key in _database.Field_Value
                          from value in _database.Value
                          from field in fields
                          where key.FieldID == field.ID && key.ValueID == value.ID
                          group value.BLOB by value.Time
                              into res
                              select res);

            return values;
        }

        /// <summary>
        /// Получить имена журналов
        /// </summary>
        /// <returns>Возвращает ObservableCollection с именами журналов</returns>
        public ObservableCollection<string> GetJournalsName()
        {
            var names = (from journal in _database.Journal orderby journal.ID select journal.Name);
            return new ObservableCollection<string>(names);
        }

        /// <summary>
        /// Получить ID журнала по его имени
        /// </summary>
        /// <param name="nameJournal">Имя журнала</param>
        /// <returns>Возвращает ID журнала</returns>
        public int GetIdByName(string nameJournal)
        {
            return (from journal in _database.Journal where journal.Name == nameJournal select journal.ID).First();
        }

        /// <summary>
        /// Добавление события в журнал
        /// </summary>
        /// <param name="body">Тело сообщения</param>
        /// <param name="time">Дата сообщения</param>
        /// <param name="draftState">флаг черновика</param>
        /// <param name="idFeild">Id поля</param>
        public void InsertEvent(string body, DateTime time, bool draftState,int idFeild)
        {
            Value value = new Value { BLOB = body, Time = time, Draft = draftState};
            Field_Value fieldValue = new Field_Value { Value = value, FieldID = idFeild };
            _database.Field_Value.InsertOnSubmit(fieldValue);
        }

        /// <summary>
        /// Применяет изменения базы данных
        /// </summary>
        public void ApplyChanges()
        {
            _database.SubmitChanges();
        }
    }
}
